package com.joyd.joydlibexample

import android.accessibilityservice.AccessibilityServiceInfo
import android.view.accessibility.AccessibilityEvent
import android.view.accessibility.AccessibilityNodeInfo
import android.view.accessibility.AccessibilityWindowInfo
import com.joyd.joydlib.dev.AccessibilityServiceHelper

/**
 * JoydLib示例应用的无障碍服务实现
 * 这是一个具体的无障碍服务实现类，用于示例应用
 */
class JoydLibExampleAccessibilityService : AccessibilityServiceHelper.JoydLibAccessibilityService() {
    companion object {
        private const val TAG = "JoydLibAccessibilityService"
    }

    override fun onServiceConnected() {
        super.onServiceConnected()
        
        // 设置无障碍服务信息
        val serviceInfo = AccessibilityServiceInfo().apply {
            // 设置事件类型，监听所有事件
            eventTypes = AccessibilityEvent.TYPES_ALL_MASK
            
            // 设置反馈类型
            feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC
            
            // 设置能够检索窗口内容
            flags = AccessibilityServiceInfo.FLAG_RETRIEVE_INTERACTIVE_WINDOWS or
                    AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS or
                    AccessibilityServiceInfo.FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY or
                    AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS
            
            // 设置服务能够处理的包名，这里设为null表示可以处理所有应用
            packageNames = null
        }
        
        // 应用服务信息
        setServiceInfo(serviceInfo)
    }

    override fun onAccessibilityEvent(event: AccessibilityEvent?) {
        // 处理无障碍事件
        // 这里可以根据需要处理各种无障碍事件，如窗口变化、内容变化等
        // 对于屏幕点击功能，我们可能不需要特别处理这些事件
        event?.let {
            // 可以在这里添加事件处理逻辑
            // 例如：
            // when (event.eventType) {
            //     AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED -> {
            //         // 窗口状态变化事件处理
            //     }
            //     // 其他事件类型处理
            // }
        }
    }

    override fun onInterrupt() {
        // 服务被中断时的处理
        // 通常不需要特别处理，服务断开时会调用onDestroy()
    }

    /**
     * 查找指定文本的节点
     * @param text 要查找的文本
     * @return 找到的节点，如果未找到则返回null
     */
    fun findNodeByText(text: String): AccessibilityNodeInfo? {
        val rootNode = rootInActiveWindow ?: return null
        val nodeList = rootNode.findAccessibilityNodeInfosByText(text)
        return if (nodeList.isNotEmpty()) nodeList[0] else null
    }

    /**
     * 查找指定ID的节点
     * @param viewId 要查找的视图ID
     * @return 找到的节点，如果未找到则返回null
     */
    fun findNodeById(viewId: String): AccessibilityNodeInfo? {
        val rootNode = rootInActiveWindow ?: return null
        val nodeList = rootNode.findAccessibilityNodeInfosByViewId(viewId)
        return if (nodeList.isNotEmpty()) nodeList[0] else null
    }

    /**
     * 执行节点点击操作
     * @param node 要点击的节点
     * @return 是否点击成功
     */
    fun performClick(node: AccessibilityNodeInfo?): Boolean {
        node?.let {
            if (it.isClickable && it.isEnabled) {
                return it.performAction(AccessibilityNodeInfo.ACTION_CLICK)
            }
        }
        return false
    }

    /**
     * 获取当前活动窗口的根节点
     * @return 根节点，如果无法获取则返回null
     */
    fun getRootNode(): AccessibilityNodeInfo? {
        return rootInActiveWindow
    }

    /**
     * 获取当前窗口列表
     * @return 窗口列表，如果无法获取则返回空列表
     */
    override fun getWindows(): List<AccessibilityWindowInfo> {
        return if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            windows ?: emptyList()
        } else {
            emptyList()
        }
    }

    /**
     * 获取当前活动窗口
     * @return 活动窗口，如果无法获取则返回null
     */
    fun getActiveWindow(): AccessibilityWindowInfo? {
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            for (window in windows ?: emptyList()) {
                if (window.type == AccessibilityWindowInfo.TYPE_APPLICATION) {
                    return window
                }
            }
        }
        return null
    }
}